Access TokenとRefresh Tokenの関係
#http #認証
認証サーバー的なのが、リソースサーバーの鍵用にトークンを発行する際には、基本的に2つのトークンを発行する。
1つがアクセストークン、もう1つがリフレッシュトークン。
よくある認証アーキテクチャ
https://scrapbox.io/files/6367c0d0ac5169001d17303f.png
それぞれの役割
アクセストークン
リソースサーバーの通行証的な役割がある。
有効期限は短く設定するのが定石。1分 ~ 1時間くらい。
リソースサーバーに向けての鍵。
リフレッシュトークン
アクセストークンを再発行する役割がある
有効期限は長く設定するのが定石。2週間 ~ 1ヶ月くらい。
リフレッシュトークンに向けての鍵。
それぞのアクセストークンは、SPAにおいてどう保存されるのがいいのか?
参考:JWTの保存先はどこが良いの?、認証あれこれ疑問雑記
セキュリティだけを考えた時に一番良いのは、どちらもCookie(Http Only)に保存するのが良い。
だが、アクセストークンをCookieに保存するのは、APIサーバーと認証サーバーが同一オリジンでない限り難しい。
そして、スケールさせていく前提のマイクロサービスのようなシステムだと、同一オリジンで管理されることはない。
なので、アクセストークンはLocal Storageやin-memoryで保存されるのが適切。
Local Storage, in-memoryだとXSSで、トークンを盗まれやすいという問題はあるかもしれない。
それへの対抗策としては「有効期限を短くする」というのが挙げられる。
逆に、リフレッシュトークンはSessionやWeb Workerに保存するのが良い。
XSSがあったとしても、情報を抜き取りにくい。
まあ、APIは普通に叩かれちゃうんだが...。
なので、広範囲な無差別XSSには強いと言っておこう。
よくある話
リフレッシュトークンはいつ使われる?
①:アクセストークンの有効期限が切れててリソースサーバーから401が返ってきた時
エラーハンドリングしてリフレッシュする。
②:アクセストークンの有効期限5分前になった時
一定間隔で確認しておいて、自動でリフレッシュしておく。
リフレッシュトークンの有効期限が来たら?
ユーザーは再度、認証サーバーに対してパスワード認証なり何なりする必要がある。
参考:
Refresh Tokenってなに?〜JWTと絡めて〜
ユーザーをログアウトから守れ!―シーケンス図から読み解くログイン状態維持【Mobileアプリ編】 | DevelopersIO